home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / -in_the_mag- / emulation / consoles / vision-8 / sources / c8debug.c < prev    next >
C/C++ Source or Header  |  1997-12-12  |  4KB  |  169 lines

  1. /** Vision8: CHIP8 emulator *************************************************/
  2. /**                                                                        **/
  3. /**                               C8Debug.h                                **/
  4. /**                                                                        **/
  5. /** This file contains a small debugger                                    **/
  6. /**                                                                        **/
  7. /** Copyright (C) Marcel de Kogel 1997                                     **/
  8. /**     You are not allowed to distribute this software commercially       **/
  9. /**     Please, notify me, if you make any changes to this file            **/
  10. /****************************************************************************/
  11.  
  12. #include "CHIP8.h"
  13.  
  14. #ifdef DEBUG
  15.  
  16. #include <stdio.h>
  17.  
  18. /****************************************************************************/
  19. /* This routine is called every opcode when chip8_trace==1. It prints the   */
  20. /* current register contents and the opcode being executed                  */
  21. /****************************************************************************/
  22. void chip8_debug (word opcode,struct chip8_regs_struct *regs)
  23. {
  24.  int i;
  25.  byte v1[4],v2[4];
  26.  sprintf (v1,"V%x",(opcode>>8)&0x0f);
  27.  sprintf (v2,"V%x",(opcode>>4)&0x0f);
  28.  printf ("PC=%04x: %04x - ",regs->pc,opcode);
  29.  switch (opcode>>12)
  30.  {
  31.   case 0:
  32.    printf ("SYS  %03X - ",opcode&0xff);
  33.    switch (opcode&0xfff)
  34.    {
  35.     case 0xe0:
  36.      puts ("Clear screen");
  37.      break;
  38.     case 0xee:
  39.      puts ("Return from subroutine");
  40.      break;
  41.     default:
  42.      puts ("Unknown system call");
  43.    }
  44.    break;
  45.   case 1:
  46.    printf ("JMP  %03x",opcode&0xfff);
  47.    break;
  48.   case 2:
  49.    printf ("CALL %03x",opcode&0xfff);
  50.    break;
  51.   case 3:
  52.    printf ("SKEQ %s,%02x",v1,opcode&0xff);
  53.    break;
  54.   case 4:
  55.    printf ("SKNE %s,%02x",v1,opcode&0xff);
  56.    break;
  57.   case 5:
  58.    printf ("SKEQ %s,%s",v1,v2);
  59.    break;
  60.   case 6:
  61.    printf ("LD   %s,%02x",v1,opcode&0xff);
  62.    break;
  63.   case 7:
  64.    printf ("ADD  %s,%02x",v1,opcode&0xff);
  65.    break;
  66.   case 8:
  67.    switch (opcode&0x0f)
  68.    {
  69.     case 0:
  70.      printf ("LD   %s,%s",v1,v2);
  71.      break;
  72.     case 1:
  73.      printf ("OR   %s,%s",v1,v2);
  74.      break;
  75.     case 2:
  76.      printf ("AND  %s,%s",v1,v2);
  77.      break;
  78.     case 3:
  79.      printf ("XOR  %s,%s",v1,v2);
  80.      break;
  81.     case 4:
  82.      printf ("ADD  %s,%s",v1,v2);
  83.      break;
  84.     case 5:
  85.      printf ("SUB  %s,%s",v1,v2);
  86.      break;
  87.     case 6:
  88.      printf ("SHR  %s,%s",v1,v2);
  89.      break;
  90.     case 7:
  91.      printf ("RSB  %s,%s",v1,v2);
  92.      break;
  93.     case 14:
  94.      printf ("SHL  %s,%s",v1,v2);
  95.      break;
  96.     default:
  97.      printf ("Illegal opcode");
  98.    }
  99.    break;
  100.   case 9:
  101.    printf ("SKNE %s,%s",v1,v2);
  102.    break;
  103.   case 10:
  104.    printf ("MVI  %03x",opcode&0xfff);
  105.    break;
  106.   case 11:
  107.    printf ("JMI  %03x",opcode&0xfff);
  108.    break;
  109.   case 12:
  110.    printf ("RAND %s,%s",v1,v2);
  111.    break;
  112.   case 13:
  113.    printf ("SPRITE %s,%s,%x",v1,v2,opcode&0x0f);
  114.    break;
  115.   case 14:
  116.    switch (opcode&0xff)
  117.    {
  118.     case 0x9e:
  119.      printf ("SKP  %s",v1);
  120.      break;
  121.     case 0xa1:
  122.      printf ("SKNP %s",v1);
  123.      break;
  124.     default:
  125.      printf ("Illegal opcode");
  126.    }
  127.    break;
  128.   case 15:
  129.    switch (opcode&0xff)
  130.    {
  131.     case 0x07:
  132.      printf ("LD  %s,DT",v1);
  133.      break;
  134.     case 0x0a:
  135.      printf ("LD  %s,KEY",v1);
  136.      break;
  137.     case 0x15:
  138.      printf ("LD   DT,%s",v1);
  139.      break;
  140.     case 0x18:
  141.      printf ("LD   ST,%s",v1);
  142.      break;
  143.     case 0x1e:
  144.      printf ("ADD  I,%s",v1);
  145.      break;
  146.     case 0x29:
  147.      printf ("LD   I,SPRITE(%s)",v1);
  148.      break;
  149.     case 0x33:
  150.      printf ("BCD  %s",v1);
  151.      break;
  152.     case 0x55:
  153.      printf ("LD   [I],%s",v1);
  154.      break;
  155.     case 0x65:
  156.      printf ("LD   %s,[I]",v1);
  157.      break;
  158.     default:
  159.      printf ("Illegal opcode");
  160.    }
  161.    break;
  162.  }
  163.  printf ("\n Registers: ");
  164.  for (i=0;i<16;++i) printf ("%02x ",(regs->alg[i])&0xff);
  165.  printf ("\n Index: %03x Stack:%03x Delay:%02x Sound:%02x\n",
  166.          regs->i&0xfff,regs->sp&0xfff,regs->delay&0xff,regs->sound&0xff);
  167. }
  168. #endif
  169.